/**
 * 安全的JSON序列化工具
 * 处理包含特殊字符的数据，避免JSON解析错误
 */

/**
 * 安全的JSON序列化函数
 * @param {any} data - 要序列化的数据
 * @returns {string} - 安全的JSON字符串
 */
function safeJsonStringify(data) {
    try {
        return JSON.stringify(data, (key, value) => {
            if (typeof value === 'string') {
                // 清理可能导致JSON解析错误的控制字符和特殊字符
                return value
                    .replace(/[\u0000-\u001F\u007F-\u009F]/g, '') // 移除控制字符
                    .replace(/\\/g, '\\\\')  // 转义反斜杠
                    .replace(/"/g, '\\"')    // 转义双引号
                    .replace(/\n/g, '\\n')   // 转义换行符
                    .replace(/\r/g, '\\r')   // 转义回车符
                    .replace(/\t/g, '\\t');  // 转义制表符
            }
            return value;
        });
    } catch (error) {
        console.error('JSON序列化失败:', error);
        // 返回一个安全的错误响应
        return JSON.stringify({
            error: true,
            message: 'JSON序列化失败'
        });
    }
}

/**
 * 清理字符串中的特殊字符
 * @param {string} str - 要清理的字符串
 * @returns {string} - 清理后的字符串
 */
function cleanString(str) {
    if (typeof str !== 'string') {
        return str;
    }
    
    return str
        .replace(/[\u0000-\u001F\u007F-\u009F]/g, '') // 移除控制字符
        .replace(/\\/g, '\\\\')  // 转义反斜杠
        .replace(/"/g, '\\"')    // 转义双引号
        .replace(/\n/g, '\\n')   // 转义换行符
        .replace(/\r/g, '\\r')   // 转义回车符
        .replace(/\t/g, '\\t');  // 转义制表符
}

/**
 * 深度清理对象中的所有字符串
 * @param {any} obj - 要清理的对象
 * @returns {any} - 清理后的对象
 */
function deepCleanObject(obj) {
    if (typeof obj === 'string') {
        return cleanString(obj);
    }
    
    if (Array.isArray(obj)) {
        return obj.map(item => deepCleanObject(item));
    }
    
    if (obj && typeof obj === 'object') {
        const cleaned = {};
        for (const [key, value] of Object.entries(obj)) {
            cleaned[key] = deepCleanObject(value);
        }
        return cleaned;
    }
    
    return obj;
}

module.exports = {
    safeJsonStringify,
    cleanString,
    deepCleanObject
};